/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clasificador.genetico.reglas;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import utils.Couple;
import utils.Weighted;
import clasificador.genetico.PoliticaCruce;
import java.util.Arrays;
import utils.Tuple;

/**
 *
 * @author e235166
 */
public final class CruceReglas1 implements PoliticaCruce<TGenotipo> {

    private double probCruce;
    private double decay;
    private Random r;

    public CruceReglas1(double probCruce, double decay) {
        this.probCruce = probCruce;
        this.decay = decay;
        this.r = new Random();
    }

    private Tuple<int[], Integer> reglaAleatoria(TGenotipo gen) {
        int pos = r.nextInt(gen.size());
        return gen.get(pos);
    }
    
    private static Tuple<int[], Integer> copiarRegla(Tuple<int[], Integer> regla) {
        int[] atributos = Arrays.copyOf(regla.l(), regla.l().length);
        return new Tuple<>(atributos, regla.r());
    }

    private TGenotipo hijoAleatorio(
            double prop,
            TGenotipo padre1,
            TGenotipo padre2) {
        
            int length = r.nextInt(2) == 0? padre1.size(): padre2.size();
            
            TGenotipo hijo = new TGenotipo(length);

            for (int i = 0; i < length; i++) {
                TGenotipo progenitor = r.nextDouble() < prop? padre1: padre2;
                int regla = r.nextInt(progenitor.size());
                hijo.add(progenitor.get(regla));
            }

            return hijo;
    }

    @Override
    public List<TGenotipo> cruzar(Couple<Weighted<TGenotipo>> pareja) {
        TGenotipo genotipo1 = pareja.l().l();
        TGenotipo genotipo2 = pareja.r().l();
        double p = pareja.l().r() / (pareja.l().r() + pareja.r().r());

        List<TGenotipo> l = new ArrayList<>(4);

        l.add(genotipo1.copy());
        l.add(genotipo2.copy());
        l.add(hijoAleatorio(p, genotipo1, genotipo2));
        l.add(hijoAleatorio(p, genotipo1, genotipo2));

        return l;
    }
}
